package goswd

import (
	"fmt"
	"log"
	"longmen/server/pkg/common/helper/blackWorlds/goswd/lib"
	"strings"
	"sync"
)

var (
	instance *swd.SWD  // 包级变量，确保可以在外部访问
	initErr  error     // 初始化错误
	once     sync.Once // 确保初始化过程只会执行一次
)

type GoSwd struct {
	swdInstance *swd.SWD
}

// InitGoSwdWords 用于初始化 GoSwd，接收黑词列表并将其添加到 SWD 实例中
func InitGoSwdWords(keyWords []string) (*GoSwd, error) {
	once.Do(func() {
		instance, initErr = swd.New()
		if initErr != nil {
			log.Printf("初始化 SWD 失败: %v", initErr)
			return
		}
		// 仅当有黑词时才添加
		if len(keyWords) > 0 {
			customWords := make(map[string]swd.Category, len(keyWords))
			// 将所有黑词转换为小写（不区分大小写）
			for _, v := range keyWords {
				customWords[strings.ToLower(v)] = swd.Custom
			}
			// 添加黑词到 SWD
			if err := instance.AddWords(customWords); err != nil {
				initErr = fmt.Errorf("添加黑名单词库失败: %w", err)
				return
			}
		}
	})
	if initErr != nil {
		return nil, initErr
	}
	return &GoSwd{swdInstance: instance}, nil
}

func (s *GoSwd) UpdateWords(keyWords []string) error {
	customWords := make(map[string]swd.Category, len(keyWords))
	for _, v := range keyWords {
		customWords[v] = swd.Custom
	}
	if err := s.swdInstance.AddWords(customWords); err != nil {
		return err
	}
	return nil
}

func (s *GoSwd) ReplaceWithAsterisk(text string) string {
	return s.GetInstance().ReplaceWithAsterisk(strings.ToLower(text))
}

// GetInstance 获取 SWD 实例
func (s *GoSwd) GetInstance() *swd.SWD {
	return s.swdInstance
}
